package org.example.test.test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

/**
 * 字符统计及重排
 * 给出一个仅包含字母的字符串，不包含空格，统计字符串中各个字母(区分大小写)出现的次数，并按照字母出现次数从大到小的顺序。
 * 输出各个字母及其出现次数。如果次数相同，按照自然顺序进行排序，且小写字母在大写字母之前。
 *
 * 输入 xyxyXX
 * 输出 x:2;y:2;X:2;
 * 说明 每个字符出现的个数都是2，故x排在y之前，而小写字母x在X之前
 * 输入 abababb
 * 输出 b:4;a:3;
 * 说明 b的出现个数比a多，故b排在a之前
 */

public class StatisticalRanking {
    public static void main(String[] args) {
        System.out.println(statisticalRanking("abababb"));
    }

    public static String statisticalRanking(String s) {
        HashMap<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < s.length(); i++) {
            Character key = s.charAt(i);
            if (map.containsKey(key)) {
                Integer value = map.get(key);
                map.put(key, value + 1);
            } else {
                map.put(key, 1);
            }
        }
        ArrayList<Map.Entry<Character, Integer>> entries = new ArrayList<>(map.entrySet());
        entries.sort((o1, o2) -> {
            Character key1 = o1.getKey();
            Character key2 = o2.getKey();
            Integer value1 = o1.getValue();
            Integer value2 = o2.getValue();
            if (value1 > value2) {
                return -1;
            } else if (value1 < value2) {
                return 1;
            } else {
                if (('a' < key1 && key1 < 'z' && 'a' < key2 && key2 < 'z') || ('A' < key1 && key1 < 'Z' && 'A' < key2 && key2 < 'Z')){
                    if (key1 > key2) {
                        return 1;
                    } else {
                        return -1;
                    }
                }else {
                    if (key1 > key2) {
                        return -1;
                    } else {
                        return 1;
                    }
                }
            }
        });

        StringBuilder stringBuilder = new StringBuilder();
        for (Map.Entry<Character, Integer> entry : entries) {
            stringBuilder.append(entry.getKey()).append(":").append(entry.getValue()).append(";");
        }
        return stringBuilder.toString();
    }
}
